﻿using System;
using System.Web;
namespace Pixysoft.Framework.Comet
{
    interface ICometRequest
    {
        /// <summary>
        /// 不同request之间切换 在connect的时候发生
        /// </summary>
        /// <param name="request"></param>
        void TransferFrom(ICometRequest request);

        /// <summary>
        /// 清空消息 标志状态
        /// </summary>
        void Dispose();

        /// <summary>
        /// 在建立链接的时候发生
        /// </summary>
        void Subscribe(HttpContext context);

        /// <summary>
        /// 设置为持久信道
        /// 建立链接的时候发生
        /// </summary>
        void SetPersisted();

        /// <summary>
        /// 链接超时时发生 表示链接仍然有效
        /// </summary>
        void UnSubscribe();



        /// <summary>
        /// 取得最后一条信息 用于Persist模式
        /// </summary>
        /// <returns></returns>
        ICometMessage GetLastMessage();

        /// <summary>
        /// 取得下一条信息 时间戳 = -1。
        /// </summary>
        /// <returns></returns>
        ICometMessage GetNextMessage();

        /// <summary>
        /// 取得下一条信息 时间戳 = -1。
        /// </summary>
        /// <returns></returns>
        ICometMessage GetNextMessage(long lastMessageTimeStamp);

        /// <summary>
        /// 获取所有消息 如果消息是非持久的，则删除
        /// </summary>
        /// <returns></returns>
        ICometMessage[] GetAllMessages();


        /// <summary>
        /// 添加消息 如果是持久消息 则先清空旧数据 返回消息最新的时间戳
        /// </summary>
        /// <param name="message"></param>
        long AddMessages(params ICometMessage[] messages);

        /// <summary>
        /// 清空消息
        /// </summary>
        void ClearMessages();

        /// <summary>
        /// 检查是否存在
        /// </summary>
        /// <param name="pool"></param>
        void Visit(ICometRequestPool pool);



        string RequestUid { get;}

        bool IsDisposed { get; }

        bool IsPersisted { get; }

        bool IsSubscribed { get; }

        int MessageCount { get; }

        string SenderCode { get; }

        DateTime RequestEndDate { get; }

        DateTime StartDate { get; }

        DateTime ConnectionEndDate { get; }

        HttpContext Context { get;}

        /// <summary>
        /// 1. 用于persist模式下，接收方获取数据的时候 对比时间戳
        /// 2. 用于发送数据方检查数据是否被处理过，如果发现一段时间没有被处理，则停止发送。
        /// </summary>
        DateTime LastPickupDate { get;}

        /// <summary>
        /// 1. 用于persist模式下，数据存在缓存，发送方获取最新有效数据
        /// </summary>
        long LastMessageTimeStamp { get;}
    }
}
